home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / FrodoV1_5.lha / src / 6569mono.i < prev    next >
Text File  |  1995-04-01  |  9KB  |  430 lines

  1. *
  2. * 6569mono.i - Schnellere VIC-Emulation (Amiga monochrom)
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise:
  12. *  - Die monochrome Emulation arbeitet nicht mit einer Chunky-Bitmap,
  13. *    sondern schreibt die rohen Grafikdaten direkt in eine Amiga-Bitplane
  14. *  - Farbwerte werden ignoriert, der Hintergrund ist immer schwarz, die
  15. *    Grafik immer weiß, ebenso bei den Sprites. Eine Ausnahme bildet die
  16. *    Rahmenfarbe: Sie ist immer weiß, außer wenn der Rahmen schwarz ist
  17. *
  18.  
  19.  
  20. *
  21. * Definitionen
  22. *
  23.  
  24. BytesPerLine    = $180/8    ;Anzahl Bytes pro Zeile in einer Bitplane
  25.  
  26. *
  27. * Makros
  28. *
  29.  
  30. ; Sprite darstellen
  31. FDoSprite    MACRO    ;Nummer
  32.         moveq    #\1,d6        ;d6: Spritenummer
  33.         btst    d6,SPRITEON(a4)    ;Wird das Sprite dargestellt?
  34.         beq    \@1$
  35.  
  36.         move.l    MATRIXBASE(a4),a0
  37.         moveq    #0,d0
  38.         move.b    $03f8+\1(a0),d0    ;d0: Datenzeiger
  39.         move.w    MC\1(a4),d1    ;d1: MC
  40.         move.w    SPRX\1(a4),d5    ;d5: X-Koordinate
  41.         bsr    FDrawSprite
  42. \@1$
  43.         ENDM
  44.  
  45.  
  46. **
  47. ** Eine Rasterzeile ausführen (monochrom)
  48. **
  49. ** d7: Rasterzeilenzähler
  50. ** a4: Zeiger auf VIC-Register
  51. ** a5: Zeiger auf das Ziel im Bildschirmspeicher
  52. **
  53.  
  54. AmigaMono6569
  55.  
  56. *
  57. * Bei abgeschaltetem Bildschirm nur Rahmen zeichnen
  58. *
  59.  
  60.         tst.b    SCREENOFF(a4)
  61.         bne    FTBBorderDraw
  62.  
  63. *
  64. * VC-Zähler setzen
  65. *
  66.  
  67.         move.w    VCBASE(a4),VCCOUNT(a4)
  68.  
  69. *
  70. * "Bad Lines"-Videomatrixzugriff:
  71. * 40 Bytes aus Videomatrix und Farb-RAM lesen und zwischenspeichern
  72. *
  73.  
  74.         cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  75.         blo    FNoBadLine
  76.         cmp.w    #LastDMALine,d7
  77.         bhi    FNoBadLine
  78.  
  79.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  80.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  81.         cmp.b    YSCROLL+1(a4),d0 ;überein?
  82.         bne    FNoBadLine
  83.  
  84. FIsBadLine    move.w    VCCOUNT(a4),d2    ;d2: VC Videomatrix-Zähler
  85.  
  86.         move.l    MATRIXBASE(a4),a0 ;Videomatrixbasis holen
  87.         add.w    d2,a0        ;Videomatrixzähler dazunehmen
  88.  
  89.         lea    MatrixLine,a1    ;Nur Videomatrix-Zeile lesen
  90.         movem.l    (a0)+,d0-d6    ;40 Bytes kopieren
  91.         movem.l    d0-d6,(a1)
  92.         movem.l    (a0)+,d0-d2
  93.         movem.l    d0-d2,28(a1)
  94.  
  95.         clr.w    RC(a4)        ;RC zurücksetzen
  96.         clr.b    DISPLAYOFF(a4)    ;Darstellung anschalten
  97.  
  98.         move.w    BadLineCycles,CyclesLeft ;Andere Anzahl Zyklen
  99. FNoBadLine
  100.  
  101. *
  102. * Oberen und unteren Rahmen handhaben
  103. *
  104.  
  105.         cmp.w    DYSTOP(a4),d7    ;Unteres Ende des Fensters erreicht
  106.         bne    1$        ; -> Rahmen einschalten
  107.         st.b    BORDERON(a4)
  108.         bra    FTBBorderDraw
  109.  
  110. 1$        cmp.w    DYSTART(a4),d7    ;Oberes Ende des Fensters erreicht
  111.         bne    FTBBorderDone    ; -> Rahmen abschalten
  112.         clr.b    BORDERON(a4)
  113.         bra    FTBNoBorder
  114.  
  115. FTBBorderDone    tst.b    BORDERON(a4)    ;Rahmen an?
  116.         beq    FTBNoBorder
  117.  
  118. FTBBorderDraw    move.l    CURRENTA5(a4),a0 ;Ja, Rahmen malen
  119.  
  120.         tst.b    $20(a4)        ;Jede Farbe außer schwarz wird als weiß dargestellt
  121.         beq    FTBBorderBlack
  122.  
  123.         moveq    #-1,d0        ;Rahmen weiß
  124.         move.w    #BytesPerLine/4-1,d1
  125. FTBBorderLoop    move.l    d0,(a0)+
  126.         dbra    d1,FTBBorderLoop
  127.         bra    FVICIncA5    ;Sonst nix
  128.  
  129. FTBBorderBlack    move.w    #BytesPerLine/4-1,d1 ;Rahmen schwarz
  130. FTBBlackLoop    clr.l    (a0)+
  131.         dbra    d1,FTBBlackLoop
  132.         bra    FVICIncA5    ;Sonst nix
  133. FTBNoBorder
  134.  
  135. *
  136. * Inhalt des Fensters: Darstellung eingeschaltet?
  137. *
  138.  
  139.         lea    4(a5),a1    ;a1: Ziel in Bildschirmspeicher
  140.         lea    MatrixLine,a2    ;a2: Zeichencodes
  141.  
  142.         tst.b    DISPLAYOFF(a4)    ;$3FFF darstellen?
  143.         bne    FShow3FFF
  144.  
  145.         move.l    DisplayProc,a0    ;Nein, Routine entsprechend
  146.         jmp    (a0)        ;dem Darstellungsmodus anspringen
  147.  
  148. *
  149. * Standard-Text: Zeichendaten holen und darstellen
  150. *
  151.  
  152. FTextStd    add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  153.  
  154.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  155.         add.w    RC(a4),a0    ;RC dazunehmen
  156.  
  157.         clr.b    4(a5)        ;Hintergrund, wenn XScroll>0
  158.  
  159.         moveq    #0,d3        ;XScroll holen
  160.         move.w    XSCROLL(a4),d3
  161.         beq    FTextNoScroll
  162.  
  163. ; Schleife für 40 Zeichen
  164.         moveq    #9,d1        ;d1: 4-Zeichen-Zähler
  165.         moveq    #0,d0
  166. FCharLoop    move.b    (a2)+,d0    ;Grafikdaten von 4 Zeichen lesen
  167.         move.w    (a0,d0.w*8),d2
  168.         move.b    (a2)+,d0
  169.         move.b    (a0,d0.w*8),d2
  170.         swap    d2
  171.         move.b    (a2)+,d0
  172.         move.w    (a0,d0.w*8),d2
  173.         move.b    (a2)+,d0
  174.         move.b    (a0,d0.w*8),d2
  175.         bfins    d2,(a1){d3:32}    ;und in den Bildschirm schreiben
  176.         addq.w    #4,a1        ;Zielzeiger erhöhen
  177.         dbra    d1,FCharLoop
  178.         bra    FDoSprites
  179.  
  180. ; Schleife für 40 Zeichen, kein XScroll
  181. FTextNoScroll    moveq    #9,d1        ;d1: 4-Zeichen-Zähler
  182.         moveq    #0,d0
  183. FNCharLoop    move.b    (a2)+,d0    ;Grafikdaten von 4 Zeichen lesen
  184.         move.w    (a0,d0.w*8),d2
  185.         move.b    (a2)+,d0
  186.         move.b    (a0,d0.w*8),d2
  187.         swap    d2
  188.         move.b    (a2)+,d0
  189.         move.w    (a0,d0.w*8),d2
  190.         move.b    (a2)+,d0
  191.         move.b    (a0,d0.w*8),d2
  192.         move.l    d2,(a1)+    ;und in den Bildschirm schreiben
  193.         dbra    d1,FNCharLoop
  194.         bra    FDoSprites
  195.  
  196. *
  197. * Standard-BitMap: Grafikdaten holen und darstellen
  198. *
  199.  
  200. FBitMapStd    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  201.         move.w    VCCOUNT(a4),d0    ;VC holen
  202.         lsl.w    #3,d0        ;*8
  203.         add.w    RC(a4),d0    ;RC dazunehmen
  204.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  205.  
  206.         add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  207.  
  208.         clr.b    4(a5)        ;Hintergrund, wenn XScroll>0
  209.  
  210.         moveq    #0,d3        ;XScroll holen
  211.         move.w    XSCROLL(a4),d3
  212.         beq    FBitMapNoScroll
  213.  
  214. ; Schleife für 40 Bytes
  215.         moveq    #9,d1        ;d1: 4-Zeichen-Zähler
  216. FBitMapLoop    move.w    (a0),d2        ;4 Bytes Grafikdaten lesen
  217.         move.b    8(a0),d2
  218.         swap    d2
  219.         move.w    16(a0),d2
  220.         move.b    24(a0),d2
  221.         bfins    d2,(a1){d3:32}    ;und in den Bildschirm schreiben
  222.         addq.w    #4,a1        ;Zielzeiger erhöhen
  223.         lea    32(a0),a0    ;Quellzeiger erhöhen
  224.         dbra    d1,FBitMapLoop
  225.         bra    FDoSprites
  226.  
  227. ; Schleife für 40 Bytes, kein XScroll
  228. FBitMapNoScroll    moveq    #9,d1        ;d1: 4-Zeichen-Zähler
  229. FNBitMapLoop    move.w    (a0),d2        ;4 Bytes Grafikdaten lesen
  230.         move.b    8(a0),d2
  231.         swap    d2
  232.         move.w    16(a0),d2
  233.         move.b    24(a0),d2
  234.         move.l    d2,(a1)+    ;und in den Bildschirm schreiben
  235.         lea    32(a0),a0    ;Quellzeiger erhöhen
  236.         dbra    d1,FNBitMapLoop
  237.         bra    FDoSprites
  238.  
  239. *
  240. * Ungültiger Darstellungsmodus: Schwarzen Bildschirm anzeigen
  241. *
  242.  
  243. FBlackScreen    add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  244.  
  245.         moveq    #9,d0        ;40 Zeichen schwarz
  246. 1$        clr.l    (a1)+
  247.         dbra    d0,1$
  248.         bra    FDoSprites
  249.  
  250. *
  251. * $3FFF darstellen
  252. *
  253.  
  254. FShow3FFF    tst.b    $21(a4)        ;Wenn der Hintergrund schwarz ist, sieht man nichts
  255.         beq    FInvis3FFF
  256.  
  257.         moveq    #0,d3        ;XScroll holen
  258.         move.w    XSCROLL(a4),d3
  259.  
  260.         clr.b    4(a5)        ;Hintergrund, wenn X-Scroll>0
  261.  
  262.         btst    #6,CTRL1(a4)
  263.         bne    11$
  264.         move.w    #$3fff,d0    ;Byte bei $3FFF lesen
  265.         bra    12$
  266. 11$        move.w    #$39ff,d0    ;ECM: Byte bei $39FF lesen
  267. 12$        GetPhysical
  268.  
  269.         move.w    (a0),d0        ;Byte als Langwort lesen
  270.         move.b    (a0),d0
  271.         swap    d0
  272.         move.w    (a0),d0
  273.         move.b    (a0),d0
  274.         not.l    d0        ;und invertieren
  275.  
  276. ; Zeile schreiben
  277.         moveq    #9,d1        ;d0: 4-Zeichen-Zähler
  278. FLoop3FFF    bfins    d0,(a1){d3:32}    ;In den Bildschirm schreiben
  279.         addq.w    #4,a1        ;Zielzeiger erhöhen
  280.         dbra    d1,FLoop3FFF
  281.         bra    FDoSprites
  282.  
  283. ; Hintergrund schwarz: 3FFF unsichtbar
  284. FInvis3FFF    moveq    #9,d1        ;d0: 4-Zeichen-Zähler
  285. FLoop3FFFInvis    clr.l    (a1)+        ;In den Bildschirm schreiben
  286.         dbra    d1,FLoop3FFFInvis
  287.  
  288. *
  289. * Sprites
  290. *
  291.  
  292. FDoSprites    tst.b    SPRITEON(a4)    ;Ist überhaupt ein Sprite z.Z. sichtbar?
  293.         bne    FDrawTheSprites    ;Ja, dann Sprites malen
  294.  
  295. *
  296. * Linken und rechten Rahmen zeichnen
  297. *
  298.  
  299. ; 40-Spalten-Rahmen
  300. FDrawLRBorder    move.l    CURRENTA5(a4),a0
  301.  
  302.         tst.b    $20(a4)
  303.         beq    FLRBorderBlack
  304.  
  305.         moveq    #-1,d0
  306.         move.l    d0,(a0)        ;Links: $00..$17
  307.         move.l    d0,44(a0)    ;Rechts: $158..$16f
  308.  
  309. ; 38-Spalten-Rahmen
  310.         tst.b    IS38COL(a4)
  311.         beq    1$
  312.         move.b    d0,4(a0)    ;Links: $18..$1e
  313.         move.b    d0,43(a0)    ;Rechts: $14f..$157
  314. 1$        bra    FVICNext
  315.  
  316. ; Schwarzer Rahmen
  317. FLRBorderBlack    clr.l    (a0)        ;40-Spalten
  318.         clr.l    44(a0)
  319.         tst.b    IS38COL(a4)    ;38-Spalten
  320.         beq    1$
  321.         clr.b    4(a0)
  322.         clr.b    43(a0)
  323. 1$
  324.  
  325. *
  326. * Ende einer sichtbaren Zeile: Zeiger in Bitmap erhöhen
  327. *
  328.  
  329. FVICNext
  330. FVICIncA5    lea    BytesPerLine(a5),a5
  331.         move.l    a5,CURRENTA5(a4)
  332.  
  333. *
  334. * Zurück zur Haupt-Routine
  335. *
  336.  
  337.         bra    VICIncRC
  338.  
  339. *
  340. * Mindestens ein Sprite ist sichtbar, Sprites malen
  341. *
  342.  
  343. ; Sprites malen
  344. FDrawTheSprites    move.l    d7,-(sp)
  345.         FDoSprite 7
  346.         FDoSprite 6
  347.         FDoSprite 5
  348.         FDoSprite 4
  349.         FDoSprite 3
  350.         FDoSprite 2
  351.         FDoSprite 1
  352.         FDoSprite 0
  353.         move.l    (sp)+,d7
  354.         bra    FDrawLRBorder
  355.  
  356.  
  357. **
  358. ** Ein Sprite zeichnen (monochrom)
  359. ** d0.l: Spritedatenzeiger
  360. ** d1.w: MC
  361. ** d5.w: X-Koordinate
  362. ** d6.l: Spritenummer (0..7)
  363. **
  364.  
  365.         CNOP    0,4
  366. FDrawSprite    lsl.w    #6,d0        ;Datenzeiger*64
  367.         add.w    d1,d0        ;MC dazunehmen
  368.         GetPhysical        ;a0: Spritedaten
  369.  
  370.         move.w    d5,d0        ;X-Koordinate
  371.         lsr.w    #3,d0        ;Pixel in Bytes umrechnen
  372.         lea    1(a5,d0.w),a1    ;a1: Ziel im Bildschirmspeicher
  373.  
  374.         btst    d6,MXE(a4)    ;X-expandiert?
  375.         bne    FSprExp
  376.  
  377.         cmp.w    #$180-24,d5    ;Sprite horizontal sichtbar?
  378.         bhs    FSpriteDone
  379.  
  380. ; Standard-Sprite
  381.         and.w    #7,d5        ;d5: Bit-Shift
  382.  
  383.         move.l    (a0),d0        ;Sprite-Daten lesen,
  384.         clr.b    d0        ; auf 24 Bit beschränken
  385.         lsr.l    d5,d0        ; verschieben
  386.         or.l    d0,(a1)        ; und in den Bildschirm schreiben
  387. FSpriteDone    rts
  388.  
  389. ; X-expandiertes Sprite
  390. FSprExp        cmp.w    #$180-48,d5    ;Sprite horizontal sichtbar?
  391.         bhs    FSpriteDone
  392.  
  393.         move.l    (a0),d0        ;Sprite-Daten lesen
  394.         lea    ExpTable,a0    ; und expandieren (3 Bytes -> 3 Worte)
  395.         moveq    #0,d1
  396.         rol.l    #8,d0
  397.         move.b    d0,d1
  398.         move.w    (a0,d1.w*2),d2
  399.         swap    d2
  400.         rol.l    #8,d0
  401.         move.b    d0,d1
  402.         move.w    (a0,d1.w*2),d2
  403.         moveq    #0,d3
  404.         rol.l    #8,d0
  405.         move.b    d0,d1
  406.         move.w    (a0,d1.w*2),d3
  407.         swap    d3
  408.  
  409.         and.w    #7,d5        ;d5: Bit-Shift
  410.         bne    1$
  411.         or.l    d2,(a1)+    ;Kein Shift, in den Bildschirm schreiben
  412.         or.l    d3,(a1)
  413.         rts
  414.  
  415. 1$        subq.w    #1,d5        ;Daten verschieben
  416. 2$        lsr.l    #1,d2
  417.         roxr.l    #1,d3
  418.         dbra    d5,2$
  419.  
  420.         or.l    d2,(a1)+    ;und in den Bildschirm schreiben
  421.         or.l    d3,(a1)
  422.         rts
  423.  
  424. *
  425. * Tabelle zum X-expandieren von Sprites
  426. *
  427.  
  428.         CNOP    0,4
  429. ExpTable    INCBIN    "ExpTable.bin"
  430.